// ActionScript file

import mx.events.CloseEvent;

private var dockImage:BitmapData;

public function initDock():void{
    //Use the loader object to load an image, which will be used for the systray       
    //After the image has been loaded into the object, we can prepare the application       
    //for docking to the system tray
    var loader:Loader = new Loader();
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, prepareForSystray);
    loader.load(new URLRequest("/icons/ChatLogo48.png"));	      
    //Catch the closing event so that the user can decide if it wants to dock or really       
    //close the application
    this.addEventListener(Event.CLOSING, closingApplication);	
}

private function closingApplication(evt:Event):void {
  //Don't close, so prevent the event from happening
  evt.preventDefault();
  closeApp(evt);
  //Check what the user really want's to do       
  //Alert.buttonWidth = 110;
  //Alert.yesLabel = "Close";
  //Alert.noLabel = "Minimize";
  //Alert.show("Close or minimize?", "Close?", 3, this, alertCloseHandler);
}

private function alertCloseHandler(event:CloseEvent):void {
  if (event.detail==Alert.YES) {
     closeApp(event);
  } else {
     dock();
  }
}

private function createSystrayRootMenu():NativeMenu{
	//Add the menuitems with the corresponding actions
	var menu:NativeMenu = new NativeMenu();
	var openNativeMenuItem:NativeMenuItem = new NativeMenuItem("Open");
	var exitNativeMenuItem:NativeMenuItem = new NativeMenuItem("Exit");
	
	//What should happen when the user clicks on something...       
	
	openNativeMenuItem.addEventListener(Event.SELECT, undock);
	exitNativeMenuItem.addEventListener(Event.SELECT, closeApp);
	
	//Add the menuitems to the menu
	menu.addItem(openNativeMenuItem);
	menu.addItem(new NativeMenuItem("",true));
	//separator
	menu.addItem(exitNativeMenuItem);
	  
	return menu;
}

public function prepareForSystray(event:Event):void {     
    //Retrieve the image being used as the systray icon
    dockImage = event.target.content.bitmapData;
  
    //For windows systems we can set the systray props       
    //(there's also an implementation for mac's, it's similar and you can find it on the net... ;) )
    if (NativeApplication.supportsSystemTrayIcon){
	//Text to show when hovering of the docked application icon       
	SystemTrayIcon(NativeApplication.nativeApplication.icon).tooltip = this.title;
	  
	//We want to be able to open the application after it has been docked       
	SystemTrayIcon(NativeApplication.nativeApplication.icon).addEventListener(MouseEvent.CLICK, undock);
	  
	//Listen to the display state changing of the window, so that we can catch the minimize       
	stage.nativeWindow.addEventListener(NativeWindowDisplayStateEvent.DISPLAY_STATE_CHANGING, nwMinimized); //Catch the minimize event
	     
	//Set some systray menu options, so that the user can right-click and access functionality          
	//without needing to open the application          
	SystemTrayIcon(NativeApplication.nativeApplication.icon).menu = createSystrayRootMenu();
	
    }else if (NativeApplication.supportsDockIcon){
    	
    var dockIcon:DockIcon = NativeApplication.nativeApplication.icon as DockIcon;
    NativeApplication.nativeApplication.addEventListener(InvokeEvent.INVOKE, undock);
    dockIcon.menu = createSystrayRootMenu();
    	
    }

}

   /**
   * Do the appropriate actions after the windows display state has changed.
   * E.g. dock when the user clicks on minize
   *
   * @Author: S.Radovanovic
   */
   private function nwMinimized(displayStateEvent:NativeWindowDisplayStateEvent):void {   
	//Do we have an minimize action?       //The afterDisplayState hasn't happened yet, but only describes the state the window will go to,       //so we can prevent it!
	if(displayStateEvent.afterDisplayState == NativeWindowDisplayState.MINIMIZED) {
	    //Prevent the windowedapplication minimize action from happening and implement our own minimize          //The reason the windowedapplication minimize action is caught, is that if active we're not able to          //undock the application back neatly. The application doesn't become visible directly, but only after clicking          //on the taskbars application link. (Not sure yet what happens exactly with standard minimize)
	    displayStateEvent.preventDefault();     
	    //Dock (our own minimize)
		dock();
	}
}

/**
* Do our own 'minimize' by docking the application to the systray (showing the application icon in the systray)
*
* @Author: S.Radovanovic
*/
public function dock():void {
	//Hide the applcation
	stage.nativeWindow.visible = false;
	  
	//Setting the bitmaps array will show the application icon in the systray
	NativeApplication.nativeApplication.icon.bitmaps = [dockImage];
}

/**
* Show the application again and remove the application icon from the systray
*
* @Author: S.Radovanovic
*/
public function undock(evt:Event):void {
	//After setting the window to visible, make sure that the application is ordered to the front,       //else we'll still need to click on the application on the taskbar to make it visible
	stage.nativeWindow.visible = true;
	stage.nativeWindow.orderToFront();
	  
	//Clearing the bitmaps array also clears the applcation icon from the systray
	NativeApplication.nativeApplication.icon.bitmaps = [];
}

/**
* Close the application
*
* @Author: S.Radovanovic
*/
private function closeApp(evt:Event):void {
	NativeApplication.nativeApplication.icon.bitmaps = [];
	stage.nativeWindow.close();
}